﻿// 974. 和可被 K 整除的子数组.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>
#include <vector>
#include <unordered_map>


using namespace std;
/*
https://leetcode.cn/problems/subarray-sums-divisible-by-k/description/

给定一个整数数组 nums 和一个整数 k ，返回其中元素之和可被 k 整除的（连续、非空） 子数组 的数目。

子数组 是数组的 连续 部分。



示例 1：

输入：nums = [4,5,0,-2,-3,1], k = 5
输出：7
解释：
有 7 个子数组满足其元素之和可被 k = 5 整除：
[4, 5, 0, -2, -3, 1], [5], [5, 0], [5, 0, -2, -3], [0], [0, -2, -3], [-2, -3]
示例 2:

输入: nums = [5], k = 9
输出: 0


提示:

1 <= nums.length <= 3 * 104
-104 <= nums[i] <= 104
2 <= k <= 104
*/


class Solution {
public:
    unordered_map<int, int> mm;
    int subarraysDivByK(vector<int>& nums, int k) {
        int presum[30010]; memset(presum, 0, sizeof presum);
        nums.insert(nums.begin(), 0);

        for (int i = 1; i < nums.size(); i++) {
            presum[i] = presum[i - 1] + nums[i];
        }
        int ans = 0;
        for (int i = 1; i < nums.size(); i++) {
             presum[i] =  (presum[i]%k+k)%k;
            int find = presum[i] % k;
            if (find == 0)ans++;
            ans += mm[find];
            mm[find]++;
        }

        return ans;
    }
};



int main()
{
    Solution s;
    vector<int> v{ -1,2,9 };
    s.subarraysDivByK(v,2);
}

 